# Appendix E

# A Skeletal Cold Start Loader

NOTE

This appendix consists of a cross-reference listing generated by the XREF utility from the results of assembly with MAC. The original source file used to generate this listing is available here.

         1                  ;THIS IS A SAMPLE COLD START LOADER, WHICH, WHEN
         2                  ;MODIFIED
         3                  ;RESIDES ON TRACK 00, SECTOR 01 (THE FIRST SECTOR ON THE
         4                  ;DISKETTE), WE ASSUME THAT THE CONTROLLER HAS LOADED
         5                  ;THIS SECTOR INTO MEMORY UPON SYSTEM START-UP (THIS
         6                  ;PROGRAM CAN BE KEYED-IN, OR CAN EXIST IN READ-ONLY
         7                  ;MEMORY
         8                  ;BEYOND THE ADDRESS SPACE OF THE CP/M VERSION YOU ARE
         9                  ;RUNNING). THE COLD START LOADER BRINGS THE CP/M SYSTEM
        10                  ;INTO MEMORY AT"LOADP" (3400H +"BIAS"). IN A 20K
        11                  ;MEMORY SYSTEM, THE VALUE OF"BIAS" IS 000H, WITH
        12                  ;LARGE
        13                  ;VALUES FOR INCREASED MEMORY SIZES (SEE SECTION 2).
        14                  ;AFTER
        15                  ;LOADING THE CP/M SYSTEM, THE COLD START LOADER
        16                  ;BRANCHES
        17                  ;TO THE "BOOT" ENTRY POINT OF THE BIOS, WHICH BEGINS AT
        18                  ; "BIOS" +"BIAS". THE COLD START LOADER IS NOT USED UN-
        19                  ;TIL THE SYSTEM IS POWERED UP AGAIN, AS LONG AS THE BIOS
        20                  ;IS NOT OVERWRITTEN. THE ORIGIN IS ASSUMED AT 0000H, AND
        21                  ;MUST BE CHANGED IF THE CONTROLLER BRINGS THE COLD START
        22                  ;LOADER INTO ANOTHER AREA, OR IF A READ-ONLY MEMORY
        23                  ;AREA
        24                  ;IS USED.
        25   0000           	ORG	0		;BASE OF RAM IN
        26                  				;CP/M
        27   0014 =         MSIZE	EQU	20		;MIN MEM SIZE IN
        28                  				;KBYTES
        29   0000 =         BIAS	EQU	(MSIZE-20)*1024	;OFFSET FROM 20K
        30                  				;SYSTEM
        31   3400 =         CCP	EQU	3400H+BIAS	;BASE OF THE CCP
        32   4A00 =         BIOS	EQU	CCP+1600H	;BASE OF THE BIOS
        33   0300 =         BIOSL	EQU	0300H		;LENGTH OF THE BIOS
        34   4A00 =         BOOT	EQU	BIOS
        35   1900 =         SIZE	EQU	BIOS+BIOSL-CCP	;SIZE OF CP/M
        36                  				;SYSTEM
        37   0032 =         SECTS	EQU	SIZE/128	;# OF SECTORS TO LOAD
        38                  ;
        39                  ;	BEGIN THE LOAD OPERATION
        40
        41                  COLD:
        42   0000 010200    	LXI	B,2		;B=0, C=SECTOR 2
        43   0003 1632      	MVI	D,SECTS		;D=# SECTORS TO
        44                  				;LOAD
        45   0005 210034    	LXI	H,CCP		;BASE TRANSFER
        46                  				;ADDRESS
        47                  LSECT:	;LOAD THE NEXT SECTOR
        48
        49                  ;	INSERT INLINE CODE AT THIS POINT TO
        50                  ;	READ ONE 128 BYTE SECTOR FROM THE
        51                  ;	TRACK GIVEN IN REGISTER B, SECTOR
        52                  ;	GIVEN IN REGISTER C,
        53                  ;	INTO THE ADDRESS GIVEN BY <HL>
        54                  ;BRANCH	TO LOCATION "COLD" IF A READ ERROR OCCURS
        55                  ;
        56                  ;
        57                  ;
        58                  ;
        59                  ;	USER SUPPLIED READ OPERATION GOES
        60                  ;	HERE...
        61                  ;
        62                  ;
        63                  ;
        64                  ;
        65   0008 C36B00    	JMP	PAST$PATCH	;REMOVE THIS
        66                  				;WHEN PATCHED
        67   000B           	DS	60H
        68
        69                  PAST$PATCH:
        70                  ;GO TO NEXT SECTOR IF LOAD IS INCOMPLETE
        71   006B 15        	DCR	D		;SECTS=SECTS-1
        72   006C CA004A    	JZ	BOOT		;HEAD. FOR THE BIOS
        73
        74                  ;	MORE SECTORS TO LOAD
        75                  ;
        76
        77                  ;WE AREN'T USING A STACK, SO USE <SP> AS SCRATCH
        78                  ;REGISTER
        79                  ;	TO HOLD THE LOAD ADDRESS INCREMENT
        80   006F 318000    	LXI	SP,128		;128 BYTES PER
        81                  				;SECTOR
        82   0072 39        	DAD	SP		;<HL> = <HL> + 128
        83   0073 0C        	INR	C		;SECTOR=SECTOR + 1
        84   0074 79        	MOV	A,C
        85   0075 FE1B      	CPI	27		;LAST SECTOR OF
        86                  				;TRACK?
        87   0077 DA0800    	JC	LSECT		;NO, GO READ
        88                  				;ANOTHER
        89
        90                  ;END OF TRACK, INCREMENT TO NEXT TRACK
        91
        92   007A 0E01      	MVI	C,1		;SECTOR = 1
        93   007C 04        	INR	B		;TRACK = TRACK + 1
        94   007D C30800    	JMP	LSECT		;FOR ANOTHER GROUP
        95   0080           	END			;OF BOOT LOADER
    BIAS             0000    29#   31
    BIOS             4A00    32#   34    35
    BIOSL            0300    33#   35
    BOOT             4A00    34#   72
    CCP              3400    31#   32    35    45
    COLD             0000    41#
    LSECT            0008    47#   87    94
    MSIZE            0014    27#   29
    PASTPATCH        006B    65    69#
    SECTS            0032    37#   43
    SIZE             1900    35#   37

Back to title page Next